import 'package:flutter/material.dart';

import 'package:get/get.dart';

/**
 * 在实际项目开发中，我们一般不会像上述那样把UI代码、业务逻辑都放在一起处理，这样对项目的架构、代码的可读性、后期的优化和维护将会是致命的。
 * GetX也为我们提供了解决方案：GetxController。

    GetxController提供了三种使用方式：

    Obx：响应式状态管理，当数据源变化时，将自动执行刷新组件的方法
    GetX：响应式状态管理，当数据源变化时，将自动执行刷新组件的方法
    GetBuilder：简单状态管理，当数据源变化时，需要手动执行刷新组件的方法，此状态管理器内部实际上是对StatefulWidget的封装，占用资源极少！

    使用场景：

    一般来说，对于大多数场景都是可以使用响应式变量。但是每个响应式变量（.obs），都需要生成对应的GetStream，如果对象足够多，将生成大量的GetStream，
    必将对内存造成较大的压力，该情况下，就要考虑使用简单状态管理了。
 */
class SampleGetXControllerHome extends StatefulWidget {
  const SampleGetXControllerHome({Key? key}) : super(key: key);

  @override
  _SampleGetXControllDemoState createState() => _SampleGetXControllDemoState();
}

class _SampleGetXControllDemoState extends State<SampleGetXControllerHome> {
  @override
  Widget build(BuildContext context) {
    // 通过依赖注入方式实例化的控制器
    final counter = Get.put(CounterController());
    return GetMaterialApp(
      home: Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: Text("GetController示例"),
        ),
        body: Container(
          padding: EdgeInsets.only(left: 16, right: 16),
          child: ListView(
            children: [
              Obx(() => Text(
                    "count的值为: ${counter.count}",
                    style: TextStyle(fontSize: 20),
                  )),
              GetX<CounterController>(
                init: counter,
                builder: (controller) {
                  return Text(
                    "count的值为: ${counter.count}",
                    style: TextStyle(fontSize: 20),
                  );
                },
              ),
              const SizedBox(
                height: 15,
              ),
              ElevatedButton(
                  onPressed: () {
                    counter.increment();
                  },
                  child: const Text("点击Count++"))
            ],
          ),
        ),
      ),
    );
  }
}

/// 继承于GetxController的类，处理页面逻辑的，
class CounterController extends GetxController {
  /// 定义了该变量为响应式变量，当该变量数值变化时，页面的刷新方法将自动刷新
  var count = 0.obs;

  /// 自增方法
  void increment() => ++count;
}
